mscJNeuralNet.net
Class Net

java.lang.Object
  extended bymscJNeuralNet.net.Net
All Implemented Interfaces:
observerPattern.Observable

public class Net
extends java.lang.Object
implements observerPattern.Observable

Das eigentliche Multilayered Perceptron (MLP). Diese Klasse enthält die Kantengewichte des Netzes sowie die Logik zur Berechnung der Netzausgabe zu eine Eingabe. Weiterhin wird auch das eigentliche Training, die Reihenfolge der Berechnung der Gewichte und der rückpropagierte Fehlergradient für jedes Neuron hier ermittelt.
Zusätzlich enthält diese Klasse Methoden zum Laden und Speichern eines Netzes sowie Hilfsmethoden wie die Transferfunktion und die Ableitung der Transferfunktion.

Es wird immer ein Netz mit BIAS und Fullconnection erzeugt. Das BIAS wird als ein zusätzliches Neuron der Eingabeschicht mit dem konstanten Ausgabewert 1.0 realisiert, dass eine Verbindung zu allen Neuronen der verborgenen und der Ausgabeschicht besitzt.

Ein Beispiel für den Einsatz wird unter mscJNeuralNet gegeben.

Über die Schnittstelle Observable können Observer Änderungen des Netzes überwachen.

Created on 29.03.2004

Version:
19.06.2004
Author:
M. Serhat Cinar
See Also:
mscJNeuralNet, Observable

Field Summary
static double BIAS_VALUE
           
 
Constructor Summary
Net(int[] pLayerSizes)
          Erzeugt ein Netz mit der angegebenen Layerstrucktur.
 
Method Summary
static double[][] calculateGradientsOffline(Net pNet, double[][] pInputPatterns, double[][] pOutputPatterns)
          Berechnet den aktuellen Fehlergradienten für die gegebenen Lerndatensätze.
static double getAbsRandomWeightValue(double pScaleFactor)
          Liefert eine positive Zufallszahl im Bereich von [0; +pScaleFactor].
 int getAmountNeurons()
          Liefert die gesamte Anzahl der Neuronen in diesem Netz inklusive BIAS.
 int getHiddenLayerAmount()
          Liefert die Anzahl der verborgenen Schichten.
 int getInputLayerSize()
          Liefert die Größe der Eingabeschicht (ohne BIAS).
 int[][] getLayerNeurons()
          Liefert die Indizes der Neuronen in einem Layer.
 double[] getNetOutput(double[] pInputPattern)
          Berechnet die Ausgabe des Netzes zur gegebenen Eingabe (Ist-Werte).
 double[] getNeuronsOutput(double[] pInputPattern)
          Liefert die Ausgabe ALLER Neuronen zur gegebenen Eingabe.
 observerPattern.ObserverManager getObserverManager()
           
 int getOutputLayerSize()
          Liefert die Größe der Ausgabeschicht.
static double getRandomWeightValue(double pScaleFactor)
          Liefert eine Zufallszahl im Bereich von [-pScaleFactor; +pScaleFactor].
 double[][] getWeights()
          Liefert die aktuelle Kantengewichtsmatrix.
static Net load(java.io.File pTargetFile)
          Lädt ein Netz aus einer Datei.
static void save(Net pNet, java.io.File pTargetFile)
          Speichert das Netz in einer Datei.
static double sign(double x)
          Berechnet die Vorzeichenfunktion für den gegebenen Wert.
static double tanh_diff(double x)
          Berechnet die Ableitung des Tangens Hyperbolicus für den gegebenen Wert.
static double tanh(double x)
          Berechnet den Tangens Hyperbolicus des gegebenen Wertes.
 java.lang.String toString()
           
static void train(double[][] pInputPatterns, double[][] pOutputPatterns, INetTrainingAlgorithm pAlgo)
          Führt einen Lernschritt mit dem Lernverfahren und dem im Lernverfahren vermerkten Netz aus, um die gegebenen Lerndatensätze zu trainieren.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

BIAS_VALUE

public static final double BIAS_VALUE
See Also:
Constant Field Values
Constructor Detail

Net

public Net(int[] pLayerSizes)
Erzeugt ein Netz mit der angegebenen Layerstrucktur. Der Paramter-Array wird wie folgt interpretiert:
Arrayindex 0: Größe der Eingabeschicht
Arrayindex letzte Position: Größe der Ausgabeschicht
Alle Arrayindizes dazwischen: Größe der verborgenen Schichten
Es sind mindestens zwei Werte (Eingabe- / Ausgabeschicht) notwendig, um ein Netz zu erzeugen.

Parameters:
pLayerSizes - Die Größen der einzelnen Schichten.
Method Detail

getNeuronsOutput

public double[] getNeuronsOutput(double[] pInputPattern)
                          throws PatternDoesNotMatchNetException
Liefert die Ausgabe ALLER Neuronen zur gegebenen Eingabe. Die Ausgabe aller Neuronen wird zur Berechnung des Fehlergradienten benötigt. Hierzu wird intern die Methode getNetOutput(double[]) aufgerufen.

Parameters:
pInputPattern - Eingabemsuter.
Returns:
Array mit der Ausgabe eines jeden Neurons.
Throws:
PatternDoesNotMatchNetException - Falls eines der gegebenen Lerndatensätze nicht der Eingabe-/ Ausgabeschichtgröße des Netzes entspricht.

getNetOutput

public double[] getNetOutput(double[] pInputPattern)
                      throws PatternDoesNotMatchNetException
Berechnet die Ausgabe des Netzes zur gegebenen Eingabe (Ist-Werte). Das Eingabemuster wird vorwärts durch das Netz propagiert, um die Ausgabe zu berechnen.

Parameters:
pInputPattern - Eingabemuster.
Returns:
Die Netzausgabe zum gegebenen Eingabemuster.
Throws:
PatternDoesNotMatchNetException - Falls eines der gegebenen Lerndatensätze nicht der Eingabe-/ Ausgabeschichtgröße des Netzes entspricht.

getAmountNeurons

public int getAmountNeurons()
Liefert die gesamte Anzahl der Neuronen in diesem Netz inklusive BIAS.

Returns:
Die gesamte Anzahl der Neuronen in diesem Netz inklusive BIAS.

getInputLayerSize

public int getInputLayerSize()
Liefert die Größe der Eingabeschicht (ohne BIAS).

Returns:
Die Größe der Eingabeschicht (ohne BIAS).

getOutputLayerSize

public int getOutputLayerSize()
Liefert die Größe der Ausgabeschicht.

Returns:
Die Größe der Ausgabeschicht.

getWeights

public double[][] getWeights()
Liefert die aktuelle Kantengewichtsmatrix.

Returns:
Die aktuelle Kantengewichtsmatrix.

getLayerNeurons

public int[][] getLayerNeurons()
Liefert die Indizes der Neuronen in einem Layer.
Der erste Index des zurückgegebenen 2d-Arrays adressiert die einzelnen Schichten des Netzes. Das Netz hat also getLayerNeurons().length Schichten.
Der zweite Index adressiert das entsprechende Neuron in der entsprechenden Schicht. Die gespeicherten Werte sind der Index des Neurons in der Gewichtematrix.

Bsp. für ein 2x1 Netz:

 getWeights()[getLayerNeurons[0][1]][getLayerNeurons[1][0]]
 
liefert den Gewichtswert, der das erste Neuron der ersten Schicht (Eingabeschicht hat den Index 0, erstes Neuron der Eingabeschicht mit Index 1) mit dem ersten Neuron der zweiten Schicht (hier Ausgabeschicht mit Index 1, erstes Neuron mit Index 0). Zu beachten ist, dass das Neuron mit dem Index 0 der Eingabeschicht das BIAS ist:
 getWeights()[getLayerNeurons[0][0]][getLayerNeurons[1][0]]
 
liefert die Verbindung BIAS (Schicht 0, Neuronindex 0) zum ersten Neuron der zweiten Schicht (Schicht 1, Neuronindex 0).

Returns:
Die Indizes der Neuronen in einem Layer.

getHiddenLayerAmount

public int getHiddenLayerAmount()
Liefert die Anzahl der verborgenen Schichten.

Returns:
Die Anzahl der verborgenen Schichten.

getObserverManager

public observerPattern.ObserverManager getObserverManager()
Specified by:
getObserverManager in interface observerPattern.Observable

toString

public java.lang.String toString()

getRandomWeightValue

public static double getRandomWeightValue(double pScaleFactor)
Liefert eine Zufallszahl im Bereich von [-pScaleFactor; +pScaleFactor].

Parameters:
pScaleFactor - Ein positiver Wert, der festlegt, in welchem Bereich die Zufallszahl liegen soll.
Returns:
Zufallszahl im Bereich von [-pScaleFactor; +pScaleFactor].

getAbsRandomWeightValue

public static double getAbsRandomWeightValue(double pScaleFactor)
Liefert eine positive Zufallszahl im Bereich von [0; +pScaleFactor].

Parameters:
pScaleFactor - Eine positive Obergrenze für die Zufallszahl.
Returns:
positive Zufallszahl im Bereich von [0; +pScaleFactor].

calculateGradientsOffline

public static double[][] calculateGradientsOffline(Net pNet,
                                                   double[][] pInputPatterns,
                                                   double[][] pOutputPatterns)
                                            throws PatternDoesNotMatchNetException
Berechnet den aktuellen Fehlergradienten für die gegebenen Lerndatensätze. Es wird im Batch bzw. Offlineverfahren berechnet, bei der die Teil- Gradienten der einzelnen Lerndatensätze aufsummiert werden.

Parameters:
pNet - Das Netz, dessen Fehlergradienten berechnet werden sollen.
pInputPatterns - Eingabemuster der Lerndatensätze.
pOutputPatterns - Ausgabemuster der Lerndatensätze.
Returns:
Aktuelle Fehlergradienten für die gegebenen Lerndatensätze.
Throws:
PatternDoesNotMatchNetException - Falls eines der gegebenen Lerndatensätze nicht der Eingabe-/ Ausgabeschichtgröße des Netzes entspricht.

train

public static void train(double[][] pInputPatterns,
                         double[][] pOutputPatterns,
                         INetTrainingAlgorithm pAlgo)
                  throws PatternDoesNotMatchNetException
Führt einen Lernschritt mit dem Lernverfahren und dem im Lernverfahren vermerkten Netz aus, um die gegebenen Lerndatensätze zu trainieren.
Vorher sollte das zu trainierende Netz durch den Aufruf der Methode INetTrainingAlgorithm.setNet(Net) dem Lernverfahren mitgeteilt werden.
Intern werden zuerst die Fehlergradienten des Netzes durch Aufruf der Methode calculateGradientsOffline(Net, double[][], double[][]) berechnet. Dann werden die aktuellen Gradienten dem Lernverfahren durch Aufruf der Methode INetTrainingAlgorithm.setActualGradients(double[][]) mitgeteilt. Anschließend wird die private Methode updateWeights(INetTrainingAlgorithm) aufgerufen, die schließlich ihrerseits für jedes Kantengewicht die Methode INetTrainingAlgorithm.applyWeightUpdate(int, int) aufruft und den aktuellen Wert berechnet.
Nach der Aktualisierung aller Gewichte wird durch die Methode INetTrainingAlgorithm.setCycle(int) der aktuelle Lernschritt um eins erhöht.

Parameters:
pInputPatterns - Eingabemuster der Lerndaten.
pOutputPatterns - Ausgabemuster der Lerndaten.
pAlgo - Lernverfahren, mit dem trainiert werden soll.
Throws:
PatternDoesNotMatchNetException - Falls eines der gegebenen Lerndatensätze nicht der Eingabe-/ Ausgabeschichtgröße des Netzes entspricht.

tanh

public static double tanh(double x)
                   throws java.lang.ArithmeticException
Berechnet den Tangens Hyperbolicus des gegebenen Wertes.

Parameters:
x - Der Wert, dessen Tangens Hyperbolicus berechnet werden soll.
Returns:
Der Tangens Hyperbolicus des gegebenen Wertes.
Throws:
java.lang.ArithmeticException

tanh_diff

public static double tanh_diff(double x)
                        throws java.lang.ArithmeticException
Berechnet die Ableitung des Tangens Hyperbolicus für den gegebenen Wert. Die Ableitung des Tangens Hyperbolicus entspricht (1 - x^2).

Parameters:
x - Der Wert, zu dem die Ableitung des Tangens Hyperbolicus berechnet werden soll.
Returns:
Die Ableitung des Tangens Hyperbolicus für den gegebenen Wert.
Throws:
java.lang.ArithmeticException

sign

public static double sign(double x)
Berechnet die Vorzeichenfunktion für den gegebenen Wert. Die Vorzeichenfunktion ist definiert durch:
 	sign(x) = -1   falls x < 0
 	sign(x) = +1   falls x > 0
  sign(x) =  0   falls x = 0
 

Parameters:
x - Der Wert, zu dem die Vorzeichenfunktion berechnet werden soll.
Returns:
Die Vorzeichenfunktion für den gegebenen Wert.

save

public static void save(Net pNet,
                        java.io.File pTargetFile)
                 throws java.io.IOException
Speichert das Netz in einer Datei. Das Netz wird als Text gespeichert, mit dem folgenden Format:
 Anzahl Layer
 Anzahl Neuronen Layer 1 (Eingabeschicht ohne BIAS)
 Anzahl Neuronen Layer 2
 ...
 Anzahl Neuronen Layer x (Ausgabeschicht)
 
 Anzahl Neuronen insgesammt (inklusive BIAS)
 
 Gewichtswert [0][0]
 Gewichtswert [0][1]
 ...
 Gewichtswert [0][x]
 Gewichtswert [1][0]
 Gewichtswert [1][1]
 ...
 Gewichtswert [1][x]
 ...
 Gewichtswert [x][x]
 

Parameters:
pNet - Das zu speichernde Netz.
pTargetFile - Datei, in der das Netz gespeichert werden soll.
Throws:
java.io.IOException - Falls bei der Ausgabe des Netzes in die Datei ein Fehler entsteht.

load

public static Net load(java.io.File pTargetFile)
                throws java.io.IOException
Lädt ein Netz aus einer Datei. Das Format, welches geladen wird entspricht dem Speicherformat, welches unter save(Net, File) beschrieben wurde.

Parameters:
pTargetFile - Datei, aus der das Netz geladen werden soll.
Returns:
Das geladene Netz.
Throws:
java.io.IOException - Falls bei der Ausgabe des Netzes in die Datei ein Fehler entsteht.
See Also:
save(Net, File)